﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using InmobiliariaNegocio;
using Exepciones;

namespace InmobiliariaIntefaz
{
    public partial class frmInmueble : Form
    {
        private Inmobiliaria inmobiliaria;

        public frmInmueble(Inmobiliaria inmob)
        {
            InitializeComponent();
            inmobiliaria = inmob;
        }

        private void CargarGrilla()
        {
            try
            {
                BindingSource source = new BindingSource();
                grvInmuebles.AutoGenerateColumns = true;
                source.DataSource = inmobiliaria.listarInmuebles();
                grvInmuebles.DataSource = source;
                grvInmuebles.Columns[2].Visible = false;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
                
        }

        private void tsbConsultar_Click(object sender, EventArgs e)
        {
            CargarGrilla();
        }

        private void grvClientes_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                if (grvInmuebles.ColumnCount > 5)
                {
                    if (e.ColumnIndex == 0)
                        ModificarDatos();

                    if (e.ColumnIndex == 1)
                        EliminarDatos();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void ModificarDatos()
        {
            txtDireccion.Enabled = true;
            txtAmbientes.Enabled = true;
            txtLocalidad.Enabled = true;
            txtMonto.Enabled = true;

            rbtAlquiler.Enabled = true;
            rbtVenta.Enabled = true;
            rbtAmbos.Enabled = true;

            grvInmuebles.Enabled = false;

            btnAgregar.Visible = false;

            lblEstado.Text = "Modificar";

            MostrarControles();
        }

        private void EliminarDatos()
        {
            txtDireccion.Enabled = false;
            txtAmbientes.Enabled = false;
            txtLocalidad.Enabled = false;
            txtMonto.Enabled = false;
            
            rbtAlquiler.Enabled = false;
            rbtVenta.Enabled = false;
            rbtAmbos.Enabled = false;

            grvInmuebles.Enabled = false;

            btnAgregar.Visible = false;

            lblEstado.Text = "Eliminar";

            MostrarControles();
        }

        private void AgregarDatos()
        {
            btnAgregar.Visible = false;

            lblEstado.Text = "Agregar";

            MostrarControles();
        }

        private void MostrarControles()
        {
            btnAceptar.Visible = true;
            btnCancelar.Visible = true;
        }

        private void LimpiarControles()
        {
            txtDireccion.Text = "";
            txtAmbientes.Text = "";
            txtLocalidad.Text = "";
            txtMonto.Text = "";

            rbtAlquiler.Enabled = true;
            rbtVenta.Enabled = true;
            rbtAmbos.Enabled = true;

            btnAceptar.Visible = false;
            btnCancelar.Visible = false;
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            try
            {
                HabilitarControles();

                LimpiarControles();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void HabilitarControles()
        {
            txtDireccion.Enabled = true;
            txtAmbientes.Enabled = true;
            txtLocalidad.Enabled = true;
            txtMonto.Enabled = true;

            grvInmuebles.Enabled = true;

            btnAgregar.Visible = true;
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            try
            {
                if (ValidarDatos())
                {
                    if (lblEstado.Text == "Modificar")
                    {
                        int i = 0;
                        while (i < inmobiliaria.Inmuebles.Count && inmobiliaria.Inmuebles[i].Direccion.ToString() != txtDireccion.Text && inmobiliaria.Inmuebles[i].Localidad.ToString() != txtLocalidad.Text)
                            i++;

                        if (i < inmobiliaria.Inmuebles.Count)
                        {
                            string tipoOp = "X";
                            if (rbtAlquiler.Checked)
                                tipoOp = "Alquiler";
                            if (rbtVenta.Checked)
                                tipoOp = "Venta";
                            if (rbtAmbos.Checked)
                                tipoOp = "Ambos";

                            inmobiliaria.Inmuebles[i].Numero = int.Parse(lblNumero.Text);
                            inmobiliaria.Inmuebles[i].CantidadAmbientes = int.Parse(txtAmbientes.Text);
                            inmobiliaria.Inmuebles[i].Monto = float.Parse(txtMonto.Text);
                            inmobiliaria.Inmuebles[i].TipoOperacion = tipoOp;
                            inmobiliaria.Inmuebles[i].Localidad = txtLocalidad.Text;
                            inmobiliaria.Inmuebles[i].Direccion = txtDireccion.Text;

                            inmobiliaria.Inmuebles[i].Reservado = chkreservado.Checked;

                            inmobiliaria.Inmuebles[i].modificarseBD();
                            CargarGrilla();

                            txtAmbientes.Enabled = true;
                            txtLocalidad.Enabled = true;

                            btnAgregar.Visible = true;
                            grvInmuebles.Enabled = true;

                            LimpiarControles();
                        }
                        else
                            lblEstado.Text = "El inmueble no existe.";
                    }

                    if (lblEstado.Text == "Eliminar")
                    {
                        int i = 0;
                        while (i <= inmobiliaria.Inmuebles.Count && inmobiliaria.Inmuebles[i].Numero.ToString() != lblNumero.Text)
                            i++;

                        if (i < inmobiliaria.Inmuebles.Count)
                        {
                            if (inmobiliaria.Inmuebles[i].Reservado)
                                MessageBox.Show("El inmueble se encuentra reservado, no se puede eliminar.");
                            else if (inmobiliaria.existeInmuebleEnAlquiler(inmobiliaria.Inmuebles[i]))
                                MessageBox.Show("El inmueble se encuentra en alquiler, no se puede eliminar.");
                            else if (inmobiliaria.existeInmuebleEnVenta(inmobiliaria.Inmuebles[i]))
                                MessageBox.Show("El inmueble fue vendido, no se puede eliminar.");
                            else
                            {
                                inmobiliaria.Inmuebles[i].eliminarseBD();
                                inmobiliaria.eliminarInmueble(inmobiliaria.Inmuebles[i]);
                                CargarGrilla();

                                txtDireccion.Enabled = true;
                                txtMonto.Enabled = true;
                                txtAmbientes.Enabled = true;
                                txtLocalidad.Enabled = true;

                                btnAgregar.Visible = true;
                                grvInmuebles.Enabled = true;

                                LimpiarControles();
                            }
                        }
                    }

                    if (lblEstado.Text == "Agregar")
                    {
                        try
                        {
                            string n = txtLocalidad.Text;
                            if (n.Length == 0)
                            {
                                throw new BlancoExepciones();
                            }
                            string tipoOp = "X";
                            if (rbtAlquiler.Checked)
                                tipoOp = "Alquiler";
                            else if (rbtVenta.Checked)
                                tipoOp = "Venta";
                            else if (rbtAmbos.Checked)
                                tipoOp = "Ambos";
                            else
                                throw new Exception("No ha marcado el tipo de Operacion");

                            int codigo = inmobiliaria.darContadorInmuebles();
                            Inmueble inmueble = new Inmueble(codigo, txtLocalidad.Text, txtDireccion.Text, int.Parse(txtAmbientes.Text), tipoOp, false, float.Parse(txtMonto.Text));
                            inmobiliaria.agregarInmueble(inmueble);
                            inmueble.guardarseBD();
                            CargarGrilla();

                            txtAmbientes.Enabled = true;
                            txtLocalidad.Enabled = true;

                            btnAgregar.Visible = true;
                            grvInmuebles.Enabled = true;

                            LimpiarControles();
                        }
                        catch (BlancoExepciones ex)
                        {
                            MessageBox.Show(ex.Message);
                            txtLocalidad.Focus();
                        }
                        catch (FormatException ex)
                        {
                            MessageBox.Show(ex.Message);
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.Message);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void grvInmuebles_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                if (grvInmuebles.ColumnCount > 4)
                {
                    if (e.ColumnIndex == 0)
                        ModificarDatos();

                    if (e.ColumnIndex == 1)
                        EliminarDatos();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void grvInmuebles_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                if (e.RowIndex > -1)
                {
                    if (grvInmuebles.ColumnCount > 4 && grvInmuebles.Rows[e.RowIndex].Cells[2].Value != null &&
                        grvInmuebles.Rows[e.RowIndex].Cells[3].Value != null &&
                        grvInmuebles.Rows[e.RowIndex].Cells[4].Value != null)
                    {
                        lblNumero.Text = grvInmuebles.Rows[e.RowIndex].Cells[2].Value.ToString();
                        txtDireccion.Text = grvInmuebles.Rows[e.RowIndex].Cells[4].Value.ToString();
                        txtLocalidad.Text = grvInmuebles.Rows[e.RowIndex].Cells[3].Value.ToString();
                        txtAmbientes.Text = grvInmuebles.Rows[e.RowIndex].Cells[5].Value.ToString();
                        txtMonto.Text = grvInmuebles.Rows[e.RowIndex].Cells[8].Value.ToString();
                        chkreservado.Checked = bool.Parse(grvInmuebles.Rows[e.RowIndex].Cells[7].Value.ToString());

                        switch (grvInmuebles.Rows[e.RowIndex].Cells[6].Value.ToString())
                        {
                            case "Alquiler":
                                rbtAlquiler.Checked = true;
                                break;
                            case "Venta":
                                rbtVenta.Checked = true;
                                break;
                            case "Ambos":
                                rbtAmbos.Checked = true;
                                break;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            AgregarDatos();
            txtDireccion.Focus();
        }

        private void frmInmueble_Load(object sender, EventArgs e)
        {
            try
            {
                CargarGrilla();
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
         }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            try
            {
                HabilitarControles();

                LimpiarControles();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
         }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            try
            {
                CargarGrilla();
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        public bool ValidarDatos()
        {
            try
            {
                if (txtDireccion.Text.Length == 0)
                {
                    txtDireccion.Focus();
                    throw new BlancoExepcionCli("Dirección");
                }

                if (txtLocalidad.Text.Length == 0)
                {
                    txtLocalidad.Focus();
                    throw new BlancoExepcionCli("Localidad");
                }

                if (txtAmbientes.Text.Length == 0)
                {
                    txtAmbientes.Focus();
                    throw new BlancoExepcionCli("Ambientes");
                }

                if (txtMonto.Text.Length == 0)
                {
                    txtMonto.Focus();
                    throw new BlancoExepcionCli("Monto");
                }

                try
                {
                    int d = int.Parse(txtAmbientes.Text);
                }
                catch (FormatException ex)
                {
                    MessageBox.Show("El campo Ambientes debe ser numérico.");
                    return false;
                }

                try
                {
                    int t = int.Parse(txtMonto.Text);
                }
                catch (FormatException ex)
                {
                    MessageBox.Show("El campo Monto debe ser numérico.");
                    return false;
                }

                return true;
            }
            catch (BlancoExepcionCli ex)
            {
                MessageBox.Show(ex.Message);
                return false;
            }
            catch (FormatException ex)
            {
                MessageBox.Show(ex.Message);
                return false;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return false;
            }
        }
    }
}
